#include <Python.h>

//增加拍照指令和照片路径宏定义
//从摄像头获取快照的wget命令
#define WGET_CMD "wget http://127.0.0.1:8080/?action=snapshot -O /tmp/SearchFace.jpg"
//存储拍摄照片的临时文件路径
#define SEARCHFACE_FILE "/tmp/SearchFace.jpg"

//初始化人脸识别模块
void face_init(void)
{
    Py_Initialize();//初始化Python解析器

    //导入Python sys模块，用于操作Python路径
    PyObject *sys = PyImport_ImportModule("sys");

    //获取sys.path列表对象
    PyObject *path = PyObject_GetAttrString(sys, "path");

    //将当前目录"."添加到Python模块搜索路径中
    PyList_Append(path, PyUnicode_FromString("."));
}

void face_final(void)
{
    Py_Finalize();//关闭Python解释器并清理资源
}

//执行人脸识别分类
double face_category(void)
{
    double result = 0.0;//初始化匹配度结果为0

    //执行wget命令拍摄当前人脸照片并保存到指定位置
    system(WGET_CMD);
    
    //检查照片文件是否存在，不存在则直接返回0
    if(0 != access(SEARCHFACE_FILE, F_OK) )
    {
        return result;
    }

    //导入Python中的face.py模块
    PyObject *pModule = PyImport_ImportModule("face");//face.py 调用
    if (!pModule)
    {
        PyErr_Print();// 打印Python错误信息
        printf("Error: failed to load face.py\n");// 输出加载模块失败信息
        goto FAILED_MODULE;// 跳转到错误处理标签
    }

    //获取face.py模块中的alibaba_face函数
    PyObject *pFunc = PyObject_GetAttrString(pModule, "alibaba_face");
    if (!pFunc)
    {
        PyErr_Print(); // 打印Python错误信息
        printf("Error: failed to load alibaba_face\n");// 输出函数调用失败信息
        goto FAILED_FUNC;// 跳转到错误处理标签
    }

    // 调用alibaba_face函数执行人脸识别
    PyObject *pValue = PyObject_CallObject(pFunc, NULL);//调用alibabacloud_face函数
    if (!pValue)
    {
        PyErr_Print();
        printf("Error: function call failed\n");
        goto FAILED_VALUE;
    }

    // 解析Python函数返回值，将其转换为C语言的double类型
    if (!PyArg_Parse(pValue, "d", &result))//解析获取alibabacloud_face返回值，转换成C语言格式
    {
        PyErr_Print();
        printf("Error: parse failed");
        goto FAILED_VALUE;
    } 

    // 打印识别结果匹配度（保留两位小数）
    printf("result=%0.2lf\n", result);

// 错误处理和资源释放部分（采用标签跳转方式统一处理）
FAILED_VALUE:
    Py_DECREF(pValue);  // 释放Python对象引用
FAILED_FUNC:
    Py_DECREF(pFunc);   // 释放Python对象引用
FAILED_MODULE:
    Py_DECREF(pModule); // 释放Python对象引用

    return result;  // 返回人脸识别匹配度结果
}


